﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////

#pragma once

#include "GcmpModelInterface.h"
#include "IElement.h"
#include "IElementCopyPasteComponent.h"

namespace gcmp {
    class IElementParentReporter;
    class IElement;

    /// \brief 外部对象，外部自定义构建时使用该接口
    class GCMP_MODEL_INTERFACE_EXPORT IExternalObject : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IExternalObject, gcmp::IDbObject);
    public:
        /// \brief 设置该行为所属Element
        /// \param pOwnerElement 所属Element
        /// \return bool
        virtual bool SetOwnerElement(IElement* pOwnerElement) = 0;

        /// \brief 获得该外部对象所属Element
        /// \return const IElement* 所属Element
        virtual const IElement* GetOwnerElement() const = 0;

        /// \brief 获得该外部对象所属Element
        /// \return IElement* 所属Element
        virtual IElement* GetOwnerElement() = 0;

        /// \brief 完成初始化ExternalObject
        /// \return void
        virtual void FinishInitializingObject() { }

#pragma region 关联更新

        /// \brief 当弱依赖的Element被删除后，此接口会被调用。
        ///
        /// 此接口用于对删掉的弱依赖做适当的处理：
        ///   1.移除引用的Element Id。
        ///   2.将引用的Element Id设成无效值。
        ///   3.选用另外一个有意义的Element作引用。
        /// 接口类ElementUtils内有通用的方法（ElementUtils::UpdateForWeakParentDeletion）可供用户调用,通用方法会处理定位、连接、扣减、打洞、参数绑定、分区、外部数据相关逻辑。
        /// \param deleteElementIds 表示将被删除的Element ids
        /// \return void
        virtual void UpdateForWeakParentDeletion(const std::set<ElementId>& deletedElementIds) = 0;

        /// \brief 报告依赖的ElementIds
        ///
        /// 对象删除和关联更新依赖于这个接口的正确实现:
        ///   1. 报告强依赖IElement(ElementParentReporter::ReportStrong): 强依赖IElement被删除，此IElement也会自动被系统删除。
        ///   2. 报告弱依赖IElement(ElementParentReporter::ReportWeak)：弱依赖IElement被删除，此IElement会通过UpdateForWeakParentDeletion得到通知。
        /// 依赖ElementIds的来源主要有两个:
        ///   1. IElement属性直接或间接引用的Id。
        ///   2. 计算器中用到的UniqueElement Id。
        /// 接口类ElementUtils内有通用的报告依赖的ElementIds方法（ElementUtils::ReportParents）可供用户调用,通用方法会处理定位、连接、扣减、打洞、参数绑定、分区、Element图形表达、外部数据相关逻辑。
        /// \param elementParentReporter Element关系报告器
        /// \return void
        virtual void ReportParents(IElementParentReporter& elementParentReporter) const = 0;
#pragma endregion 关联更新


#pragma region 私有和受保护的方法
        friend class ElementImpl;
    protected:
        friend class GenericElement;

        //为子对象设置Document

#pragma endregion 私有和受保护的方法

#pragma region 待删除
    public:
        virtual bool FinishEditing() = 0;

#pragma endregion 待删除

    public:
        /// \brief 析构函数
        virtual ~IExternalObject() {}
    };

}// namespace gcmp


